AWS ์๋ํ์ ํ์ ๋ฐํํ์ธ์. ์ด ๊ฐ์ด๋๋ Boto3 ์ค์ , ํต์ฌ ๊ฐ๋ , S3, EC2, Lambda ์ค์ฉ ์์ ๋ฐ ๊ธ๋ก๋ฒ ํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
ํ์ด์ฌ์ผ๋ก AWS ๋ง์คํฐํ๊ธฐ: ํด๋ผ์ฐ๋ ์๋น์ค ํตํฉ์ ์ํ Boto3 SDK ์ฌ์ธต ๋ถ์
ํด๋ผ์ฐ๋ ์ปดํจํ ์ธ๊ณ์์ Amazon Web Services(AWS)๋ ๋ฐฉ๋ํ๊ณ ๊ณ์ ํ์ฅ๋๋ ์๋น์ค ์ ํ๊ตฐ์ ์ ๊ณตํ๋ ๊ธ๋ก๋ฒ ๋ฆฌ๋์ ๋๋ค. ๊ฐ๋ฐ์, ๋ฐ๋ธ์ต์ค ์์ง๋์ด, ์์คํ ์ํคํ ํธ์๊ฒ ์ด๋ฌํ ์๋น์ค์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ํธ ์์ฉํ๋ ๊ฒ์ ๋จ์ํ ํธ์๊ฐ ์๋๋ผ ํ์์ ๋๋ค. ์๋ํ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ํ๋ ฅ์ ์ด๋ฉฐ ํจ์จ์ ์ธ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ฅผ ๊ด๋ฆฌํ๋ ํต์ฌ์ ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ํ์ด์ฌ์ฉ ๊ณต์ AWS SDK์ธ Boto3๊ฐ ์ฌ๋ฌ๋ถ์ ๋ฌด๊ธฐ๊ณ ์์ ์์ด์๋ ์ ๋ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก Boto3์ ๋ํด ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃน๋๋ค. ๊ธฐ๋ณธ ์ฌํญ๋ถํฐ ์์ํ์ฌ ํต์ฌ AWS ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ณ , ๊ณ ๊ธ ๊ฐ๋ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ๊ตฌํ ๊ฒ์ ๋๋ค. ๊ฐ๋จํ ์์ ์ ์๋ํํ๋ ๋ณต์กํ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ , Boto3๋ฅผ ๋ง์คํฐํ๋ฉด AWS์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ํ์ฉํ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
Boto3 ์์ํ๊ธฐ: AWS ์๋ํ๋ฅผ ํฅํ ์ฒซ๊ฑธ์
์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์์ ํ๊ณ ๊ธฐ๋ฅ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด ์ด๊ธฐ ์ค์ ์ AWS์์ ์ํธ ์์ฉ์ด ์ฑ๊ณต์ ์ด๊ณ ์์ ํ๊ฒ ์ด๋ฃจ์ด์ง๋๋ก ํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ํ ์ ์ ์กฐ๊ฑด
- ํ์ด์ฌ ์ค์น: Boto3๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก ํ์ด์ฌ์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. ๋ค์ํ ํ์ด์ฌ ๋ฒ์ ์ ์ง์ํฉ๋๋ค. ์ต์ ์์ ๋ฒ์ ์ ํ์ด์ฌ 3 ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. ํ์ด์ฌ์ ํฌ๋ก์ค ํ๋ซํผ ํน์ฑ์ ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ํ์๊ฒ ํ๋ฅญํ ์ ํ์ด ๋ฉ๋๋ค.
- AWS ๊ณ์ : ์์ง ์๋ค๋ฉด AWS ๊ณ์ ์ ๊ฐ์ ํด์ผ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ณดํธ์ ์ด๋ฉฐ ๋ง์ ์๋น์ค์ ๋ํ ํ๋ฆฌ ํฐ์ด ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ฏ๋ก ํ์ต ๋ฐ ์คํ์ ์ ํฉํฉ๋๋ค.
- AWS ๋ฆฌ์ (Region) ์ดํด: AWS ์๋น์ค๋ ์ ์ธ๊ณ ๋ฐ์ดํฐ ์ผํฐ์์ ํธ์คํ ๋๋ฉฐ, ์ง๋ฆฌ์ ๋ฆฌ์ (์: `us-east-1`, `eu-west-2`, `ap-southeast-1`)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ๋ฆฌ์ ์ ์ ํํ๋ ๊ฒ์ ์ง์ฐ ์๊ฐ, ๋ฐ์ดํฐ ์ฃผ๊ถ ๋ฐ ๋น์ฉ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. Boto3๋ฅผ ์ฌ์ฉํ ๋ ์ํธ ์์ฉํ๋ ค๋ ๋ฆฌ์ ์ ์ง์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ค์น ๋ฐ ๊ตฌ์ฑ: ์์ ํ ๊ธฐ๋ฐ ๋ง๋ จ
์ ์ ์กฐ๊ฑด์ด ์ค๋น๋์์ผ๋ Boto3๋ฅผ ์ค์นํ๊ณ AWS ๊ณ์ ์ ์์ ํ๊ฒ ์ฐ๊ฒฐํ๋๋ก ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
1. Boto3 ์ค์น
์ค์น๋ ํ์ด์ฌ์ ํจํค์ง ์ค์น ํ๋ก๊ทธ๋จ์ธ `pip`๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ํ ์ ์์ต๋๋ค. ํฐ๋ฏธ๋์ด๋ ๋ช
๋ น ํ๋กฌํํธ๋ฅผ ์ด๊ณ ๋ค์์ ์คํํ์ธ์:
pip install boto3
2. AWS ์๊ฒฉ ์ฆ๋ช
์์ ํ๊ฒ ๊ตฌ์ฑํ๊ธฐ
์ด๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ๋จ๊ณ์
๋๋ค. ์ ๋๋ก AWS ์๊ฒฉ ์ฆ๋ช
(์ก์ธ์ค ํค ID ๋ฐ ๋ณด์ ์ก์ธ์ค ํค)์ ์ฝ๋์ ์ง์ ํ๋์ฝ๋ฉํด์๋ ์ ๋ฉ๋๋ค. ์ด๋ ์ค๋ํ ๋ณด์ ์ํ์
๋๋ค. ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ AWS ๋ช
๋ น์ค ์ธํฐํ์ด์ค(CLI)๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์์น์ ๊ตฌ์ฑํ๋ ๊ฒ์
๋๋ค.
๋จผ์ AWS CLI๋ฅผ ์ค์นํฉ๋๋ค(์์ง ์ค์นํ์ง ์์ ๊ฒฝ์ฐ). ๊ทธ๋ฐ ๋ค์ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค:
aws configure
CLI๋ ๋ค ๊ฐ์ง ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค:
- AWS Access Key ID: ๊ณ ์ ์๋ณ์์ ๋๋ค.
- AWS Secret Access Key: ๋น๋ฐ ์ํธ์ ๋๋ค. ์ผ๋ฐ ์ํธ์ฒ๋ผ ์ทจ๊ธํ์ธ์.
- Default region name: ์ฝ๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๊ฒฐํ AWS ๋ฆฌ์ ์ ๋๋ค (์: `us-west-2`).
- Default output format: ๋ณดํต `json`์ ๋๋ค.
์ด ๋ช ๋ น์ ์๊ฒฉ ์ฆ๋ช ์ `~/.aws/credentials` ํ์ผ์, ๊ธฐ๋ณธ ๋ฆฌ์ /์ถ๋ ฅ ํ์์ `~/.aws/config` ํ์ผ์ ์์ ํ๊ฒ ์ ์ฅํฉ๋๋ค. Boto3๋ ์๋์ผ๋ก ์ด ํ์ผ๋ค์ ์ฐพ๋๋ก ๋์ด ์์ผ๋ฏ๋ก ์คํฌ๋ฆฝํธ์์ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฏผ๊ฐํ ํค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด ์ฝ๋๋ฅผ ์ด์ ๊ฐ๋ฅํ๊ณ ์์ ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
Boto3์ ํต์ฌ ๊ตฌ์ฑ ์์: ํด๋ผ์ด์ธํธ์ ๋ฆฌ์์ค
Boto3๋ ํด๋ผ์ด์ธํธ(Client)์ ๋ฆฌ์์ค(Resource)๋ผ๋ ๋ ๊ฐ์ง ๋๋ ทํ ๋ฐฉ์์ผ๋ก AWS ์๋น์ค์ ์ํธ ์์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๊ณ ๊ฐ๋ ์ฑ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ํต์ฌ์ ๋๋ค.
๋ ๊ฐ์ง ์ถ์ํ ์ดํดํ๊ธฐ
๋ ๊ฐ์ง ๋ค๋ฅธ ์์ค์ ํต์ ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค:
- ํด๋ผ์ด์ธํธ (์ ์์ค): ๊ธฐ๋ณธ AWS ์๋น์ค API ์์ ์ ๋ํ ์ง์ ์ ์ธ ์ผ๋์ผ ๋งคํ์ ์ ๊ณตํฉ๋๋ค. ์๋น์ค์ ๋ํ ๋ชจ๋ ๊ฐ๋ฅํ ์์ ์ ํด๋น ํด๋ผ์ด์ธํธ๋ฅผ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ต์ ์ผ๋ฐ์ ์ผ๋ก API์ ์์ JSON ์๋ต๊ณผ ์ ์ฌํ ๋์ ๋๋ฆฌ ํํ์ ๋๋ค.
- ๋ฆฌ์์ค (๊ณ ์์ค): ๋ ์ถ์์ ์ด๊ณ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋จ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋์ , ์์ฑ๊ณผ ์์ ์ ๊ฐ์ง '๋ฆฌ์์ค' ๊ฐ์ฒด์ ์ํธ ์์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฆ ์์ฑ๊ณผ `delete()` ์์ ์ ๊ฐ์ง `S3.Bucket` ๊ฐ์ฒด๊ฐ ์์ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ API: ์ ์์ค, ์ง์ ์๋น์ค ์ ๊ทผ
ํด๋ผ์ด์ธํธ๋ Boto3์ ๊ธฐ์ด์ ์ธ ๊ณ์ธต์ ๋๋ค. ์๋น์ค์ API ์ ์ ํ์ผ์์ ์ง์ ์์ฑ๋๋ฏ๋ก ํญ์ ์ต์ ์ํ์ด๋ฉฐ ์์ ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํด์ผ ํ ๋:
- ๋ฆฌ์์ค API๋ฅผ ํตํด์๋ ์ฌ์ฉํ ์ ์๋ ์๋น์ค ์์ ์ ์ ๊ทผํด์ผ ํ ๋.
- ๋์ ๋๋ฆฌ ๊ธฐ๋ฐ์ ์๋ต์ผ๋ก ์์ ํ๋ ๊ฒ์ ์ ํธํ ๋.
- API ํธ์ถ์ ๋ํ ์ ๋์ ์ผ๋ก ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๋.
์์ : ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ S3 ๋ฒํท ๋์ดํ๊ธฐ
import boto3
# S3 ํด๋ผ์ด์ธํธ ์์ฑ
s3_client = boto3.client('s3')
# list_buckets ๋ฉ์๋ ํธ์ถ
response = s3_client.list_buckets()
# ๋ฒํท ์ด๋ฆ ์ถ๋ ฅ
print('Existing buckets:')
for bucket in response['Buckets']:
print(f' {bucket["Name"]}')
๋ฒํท ์ด๋ฆ์ ์ป๊ธฐ ์ํด `response` ๋์ ๋๋ฆฌ๋ฅผ ํ์ฑํด์ผ ํ๋ค๋ ์ ์ ์ ์ํ์ธ์.
๋ฆฌ์์ค API: ๊ฐ์ฒด ์งํฅ์ ์ ๊ทผ ๋ฐฉ์
๋ฆฌ์์ค๋ AWS์ ์ํธ ์์ฉํ๋ ๋ฐ ๋ 'ํ์ด์ฌ์ค๋ฌ์ด(Pythonic)' ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๋คํธ์ํฌ ํธ์ถ์ ์ผ๋ถ๋ฅผ ์จ๊ธฐ๊ณ ๋ ๊น๋ํ ๊ฐ์ฒด ์งํฅ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ผ ํ ๋:
- ๋ ๊ฐ๋ ์ฑ ์๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์ํ ๋.
- AWS ๊ฐ์ฒด์ ๋ํ ์ผ๋ฐ์ ์ธ ์์ ์ ์ํํ ๋.
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ ํธํ ๋.
์์ : ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ฌ S3 ๋ฒํท ๋์ดํ๊ธฐ
import boto3
# S3 ๋ฆฌ์์ค ์์ฑ
s3_resource = boto3.resource('s3')
# ๋ชจ๋ ๋ฒํท ๊ฐ์ฒด๋ฅผ ์ํ
print('Existing buckets:')
for bucket in s3_resource.buckets.all():
print(f' {bucket.name}')
์ด ์ฝ๋๋ ํ๋ฆผ์์ด ๋ ๊น๋ํฉ๋๋ค. `bucket` ๊ฐ์ฒด๋ฅผ ์ง์ ์ํํ๊ณ `.name` ์์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฆ์ ์ ๊ทผํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ๋ ๋ฆฌ์์ค: ์ด๋ ๊ฒ์ ์ ํํด์ผ ํ ๊น?
ํ๋์ ์ ๋ต์ ์์ผ๋ฉฐ, ์ข ์ข ์์ ๊ณผ ๊ฐ์ธ์ ์ ํธ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ข์ ๊ฒฝํ ๋ฒ์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฆฌ์์ค๋ก ์์ํ๊ธฐ: ์ผ๋ฐ์ ์ธ ์์ ์ ๊ฒฝ์ฐ ๋ฆฌ์์ค API๊ฐ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ข์ ์ฝ๋๋ก ์ด์ด์ง๋๋ค.
- ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด ํ์ํ ๋ ํด๋ผ์ด์ธํธ๋ก ์ ํํ๊ธฐ: ํน์ API ํธ์ถ์ด ๋ฆฌ์์ค API์์ ์ ๊ณต๋์ง ์๊ฑฐ๋ ๋งค๊ฐ๋ณ์์ ๋ํ ์ธ๋ถ์ ์ธ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ธ์.
์ฌ์ง์ด ๋์ ํผํฉํ์ฌ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ฆฌ์์ค ๊ฐ์ฒด๋ `meta` ์์ฑ์ ํตํด ๊ธฐ๋ณธ ํด๋ผ์ด์ธํธ์ ์ ๊ทผํ ์ ์์ต๋๋ค (์: `s3_resource.meta.client`).
์ค์ Boto3: ํต์ฌ AWS ์๋น์ค ์๋ํ
์ ์ธ๊ณ ์กฐ์ง์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ผ๋ถ AWS ์๋น์ค๋ฅผ ์๋ํํ์ฌ ์ด๋ก ์ ์ค์ฒ์ ์ฎ๊ฒจ ๋ณด๊ฒ ์ต๋๋ค.
Amazon S3 (Simple Storage Service): ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ํ๋ธ
S3๋ ์ ๊ณ ์ต๊ณ ์ ํ์ฅ์ฑ, ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ, ๋ณด์ ๋ฐ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์๋น์ค์ ๋๋ค. ์ข ์ข ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ ์คํ ๋ฆฌ์ง์ ์ค์ถ ์ญํ ์ ํฉ๋๋ค.
์์ : ์์ ํ S3 ์ํฌํ๋ก์ฐ
import boto3
import uuid # ๊ณ ์ ํ ๋ฒํท ์ด๋ฆ์ ์์ฑํ๊ธฐ ์ํด
# ๊ณ ์์ค ์ธํฐํ์ด์ค๋ฅผ ์ํด S3 ๋ฆฌ์์ค ์ฌ์ฉ
s3 = boto3.resource('s3')
# ๋ฒํท์ ์์ฑํ ๋ฆฌ์ ์ ํ
# ์ฐธ๊ณ : S3 ๋ฒํท ์ด๋ฆ์ ์ ์ญ์ ์ผ๋ก ๊ณ ์ ํด์ผ ํฉ๋๋ค!
region = 'us-east-1'
bucket_name = f'boto3-guide-unique-bucket-{uuid.uuid4()}'
file_name = 'hello.txt'
try:
# 1. ๋ฒํท ์์ฑ
print(f'Creating bucket: {bucket_name}...')
s3.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={'LocationConstraint': region}
)
print('Bucket created successfully.')
# 2. ํ์ผ ์
๋ก๋
print(f'Uploading {file_name} to {bucket_name}...')
bucket = s3.Bucket(bucket_name)
bucket.put_object(Key=file_name, Body=b'Hello, World from Boto3!')
print('File uploaded successfully.')
# 3. ๋ฒํท์ ๊ฐ์ฒด ๋์ด
print(f'Listing objects in {bucket_name}:')
for obj in bucket.objects.all():
print(f' - {obj.key}')
# 4. ํ์ผ ๋ค์ด๋ก๋
download_path = f'downloaded_{file_name}'
print(f'Downloading {file_name} to {download_path}...')
bucket.download_file(file_name, download_path)
print('File downloaded successfully.')
finally:
# 5. ์ ๋ฆฌ: ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ํ ๋ฒํท ์ญ์
print('Cleaning up resources...')
bucket = s3.Bucket(bucket_name)
# ๋ฒํท์ ์ญ์ ํ๊ธฐ ์ ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค
bucket.objects.all().delete()
bucket.delete()
print(f'Bucket {bucket_name} and its contents have been deleted.')
Amazon EC2 (Elastic Compute Cloud): ๊ฐ์ ์๋ฒ ๊ด๋ฆฌ
EC2๋ ํด๋ผ์ฐ๋์์ ์์ ํ๊ณ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ ์ปดํจํ ์ฉ๋์ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์น ๊ท๋ชจ์ ํด๋ผ์ฐ๋ ์ปดํจํ ์ ๋ ์ฝ๊ฒ ํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์์ : EC2 ์ธ์คํด์ค ์์ ๋ฐ ๊ด๋ฆฌ
import boto3
import time
# EC2 ๋ฆฌ์์ค ์ฌ์ฉ
ec2 = boto3.resource('ec2', region_name='us-west-2')
# ์ง์ ๋ ๋ฆฌ์ ์์ ์ ํฉํ Amazon Linux 2 AMI ์ฐพ๊ธฐ
# ์ต์ AMI ID๋ฅผ ์ป๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ์ฌ์ฉ
ec2_client = boto3.client('ec2', region_name='us-west-2')
filters = [
{'Name': 'name', 'Values': ['amzn2-ami-hvm-*-x86_64-gp2']},
{'Name': 'state', 'Values': ['available']}
]
images = ec2_client.describe_images(Owners=['amazon'], Filters=filters)
ami_id = images['Images'][0]['ImageId']
print(f'Using AMI ID: {ami_id}')
# 1. ์๋ก์ด t2.micro ์ธ์คํด์ค ์์ (์ฃผ๋ก ํ๋ฆฌ ํฐ์ด์ ํฌํจ๋จ)
instance = ec2.create_instances(
ImageId=ami_id,
InstanceType='t2.micro',
MinCount=1,
MaxCount=1,
TagSpecifications=[
{
'ResourceType': 'instance',
'Tags': [{'Key': 'Name', 'Value': 'Boto3-Guide-Instance'}]
}
]
)[0] # create_instances๋ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํจ
print(f'Instance {instance.id} is launching...')
# 2. ์ธ์คํด์ค๊ฐ 'running' ์ํ๊ฐ ๋ ๋๊น์ง ๋๊ธฐ
instance.wait_until_running()
print(f'Instance {instance.id} is now running.')
# ํผ๋ธ๋ฆญ IP ์ฃผ์๋ฅผ ์ป๊ธฐ ์ํด ์ธ์คํด์ค ์์ฑ ๋ค์ ๋ก๋
instance.reload()
print(f'Public IP Address: {instance.public_ip_address}')
# 3. ์ธ์คํด์ค ์ค์ง
print(f'Stopping instance {instance.id}...')
instance.stop()
instance.wait_until_stopped()
print(f'Instance {instance.id} is stopped.')
# 4. ์ธ์คํด์ค ์ข
๋ฃ (์๊ตฌ์ ์ผ๋ก ์ญ์ )
print(f'Terminating instance {instance.id}...')
instance.terminate()
instance.wait_until_terminated()
print(f'Instance {instance.id} has been terminated.')
AWS Lambda: ์๋ฒ๋ฆฌ์ค ํตํฉ
Lambda๋ ์๋ฒ๋ฅผ ํ๋ก๋น์ ๋ํ๊ฑฐ๋ ๊ด๋ฆฌํ์ง ์๊ณ ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์๋ฒ๋ฆฌ์ค ์ปดํจํ ์๋น์ค์ ๋๋ค. 200๊ฐ ์ด์์ AWS ์๋น์ค์์ Lambda ํจ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ฑฐ๋ ์น ๋๋ ๋ชจ๋ฐ์ผ ์ฑ์์ ์ง์ ํธ์ถํ ์ ์์ต๋๋ค.
์์ : Lambda ํจ์ ํธ์ถํ๊ธฐ
๋จผ์ AWS ๊ณ์ ์ Lambda ํจ์๊ฐ ํ์ํฉ๋๋ค. JSON ํ์ด๋ก๋๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ `my-data-processor`๋ผ๋ ๊ฐ๋จํ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
import boto3
import json
# Lambda ํด๋ผ์ด์ธํธ ์ฌ์ฉ
lambda_client = boto3.client('lambda', region_name='eu-central-1')
function_name = 'my-data-processor'
payload = {
'customer_id': '12345',
'transaction_amount': 99.99
}
try:
print(f'Invoking Lambda function: {function_name}')
response = lambda_client.invoke(
FunctionName=function_name,
InvocationType='RequestResponse', # ๋๊ธฐ์ ํธ์ถ
Payload=json.dumps(payload)
)
# ์๋ต ํ์ด๋ก๋๋ ์คํธ๋ฆฌ๋ฐ ๋ณธ๋ฌธ์ด๋ฏ๋ก ์ฝ๊ณ ๋์ฝ๋ฉํด์ผ ํฉ๋๋ค
response_payload = json.loads(response['Payload'].read().decode('utf-8'))
print('Lambda invocation successful.')
print(f'Status Code: {response["StatusCode"]}')
print(f'Response Payload: {response_payload}')
except lambda_client.exceptions.ResourceNotFoundException:
print(f'Error: Lambda function {function_name} not found.')
except Exception as e:
print(f'An error occurred: {e}')
๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ณ ๊ธ Boto3 ๊ฐ๋
๊ธฐ๋ณธ ์ฌํญ์ ์ต์ํด์ง๋ฉด Boto3์ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ํ๋ ฅ ์๊ณ ํจ์จ์ ์ด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ค๋ฅ ๋ฐ ์์ธ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ
๋คํธ์ํฌ ๋ฌธ์ , ๊ถํ ์ค๋ฅ ๋๋ ์กด์ฌํ์ง ์๋ ๋ฆฌ์์ค๋ก ์ธํด ์คํฌ๋ฆฝํธ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๊ฒฌ๊ณ ํ ์ฝ๋๋ ์ด๋ฌํ ์ค๋ฅ๋ฅผ ์์ธกํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค. Boto3๋ ์๋น์ค๋ณ ์ค๋ฅ์ ๋ํด ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก `botocore.exceptions.ClientError`์ ํ์ ํด๋์ค์ ๋๋ค.
์ด๋ฌํ ์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ์ค๋ฅ ์ฝ๋๋ฅผ ๊ฒ์ฌํ์ฌ ํน์ ๋ฌธ์ ๋ฅผ ํ์ ํ ์ ์์ต๋๋ค.
import boto3
from botocore.exceptions import ClientError
s3_client = boto3.client('s3')
bucket_name = 'a-bucket-that-does-not-exist-12345'
try:
s3_client.head_bucket(Bucket=bucket_name)
print(f'Bucket "{bucket_name}" exists.')
except ClientError as e:
# ํน์ '404 Not Found' ์ค๋ฅ ์ฝ๋ ํ์ธ
error_code = e.response['Error']['Code']
if error_code == '404':
print(f'Bucket "{bucket_name}" does not exist.')
elif error_code == '403':
print(f'Access denied. You do not have permission to access bucket "{bucket_name}".')
else:
print(f'An unexpected error occurred: {e}')
์จ์ดํฐ(Waiter): ๋น๋๊ธฐ ์์ ๋๊ธฐํํ๊ธฐ
EC2 ์ธ์คํด์ค๋ S3 ๋ฒํท ์์ฑ๊ณผ ๊ฐ์ ๋ง์ AWS ์์ ์ ๋น๋๊ธฐ์ ์ ๋๋ค. API ํธ์ถ์ ์ฆ์ ๋ฐํ๋์ง๋ง ๋ฆฌ์์ค๊ฐ ์ํ๋ ์ํ์ ๋๋ฌํ๋ ๋ฐ๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๋ณต์กํ ํด๋ง ๋ฃจํ๋ฅผ ์์ฑํ๋ ๋์ Boto3์ ๋ด์ฅ '์จ์ดํฐ(Waiter)'๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์จ์ดํฐ๋ ๋ฆฌ์์ค์ ์ํ๊ฐ ํน์ ์ํ์ ๋๋ฌํ๊ฑฐ๋ ํ์์์๋ ๋๊น์ง ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ํด๋งํฉ๋๋ค.
# ์ด ๋ด์ฉ์ EC2 ์์ ์์ ์ด๋ฏธ ์์ฐ๋์์ต๋๋ค:
# ์ธ์คํด์ค ์คํ์ ์ํ Waiter
instance.wait_until_running()
# S3 ๋ฒํท ์กด์ฌ๋ฅผ ์ํ Waiter
s3_client = boto3.client('s3')
waiter = s3_client.get_waiter('bucket_exists')
waiter.wait(Bucket='my-newly-created-bucket')
print('Bucket is now ready to use.')
ํ์ด์ง๋ค์ดํฐ(Paginator): ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ
S3 ๋ฒํท์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ชจ๋ IAM ์ฌ์ฉ์๋ฅผ ๋์ดํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ง์ ์์ ํญ๋ชฉ์ ๋ฐํํ ์ ์๋ API ํธ์ถ์ ์ข ์ข ํ์ด์ง๋ค์ด์ ๋ฉ๋๋ค. ์ด๋ ๊ฒฐ๊ณผ์ 'ํ์ด์ง'์ ๋ค์ ํ์ด์ง๋ฅผ ์์ฒญํ๊ธฐ ์ํ 'ํ ํฐ'์ ๋ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด ํ ํฐ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค.
ํ์ด์ง๋ค์ดํฐ๋ ํ ํฐ ๋ก์ง์ ๋์ ์ฒ๋ฆฌํ์ฌ ์ด ๊ณผ์ ์ ๋จ์ํํ๊ณ , ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ์ํํ๊ฒ ๋ฐ๋ณตํ ์ ์๊ฒ ํด์ค๋๋ค.
import boto3
s3_client = boto3.client('s3')
# Paginator ์์ฑ
paginator = s3_client.get_paginator('list_objects_v2')
# ๋ชจ๋ ํ์ด์ง์ ๋ํ ์ํ ๊ฐ๋ฅํ ๊ฐ์ฒด ๊ฐ์ ธ์ค๊ธฐ
pages = paginator.paginate(Bucket='a-very-large-bucket')
object_count = 0
for page in pages:
if 'Contents' in page:
for obj in page['Contents']:
# print(obj['Key'])
object_count += 1
print(f'Total objects found: {object_count}')
๊ธ๋ก๋ฒ Boto3 ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๊ธฐ๋ฅ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ์์ ํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ ๋น์ฉ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ณ๊ฐ์ ๋๋ค. ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ๊ฒ์ ํนํ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ๋ ํ์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ณด์
- ์๊ฒฉ ์ฆ๋ช ์ ํ๋์ฝ๋ฉํ์ง ๋ง์ธ์: ์ด๋ ์๋ฌด๋ฆฌ ๊ฐ์กฐํด๋ ์ง๋์น์ง ์์ต๋๋ค. EC2 ๋ฐ Lambda์ ๊ฐ์ ์๋น์ค์๋ ์์์ ์ด๊ณ ์๋์ผ๋ก ์ํ๋๋ ์๊ฒฉ ์ฆ๋ช ์ ์ ๊ณตํ๋ IAM ์ญํ ์ ์ฌ์ฉํ์ธ์. ๋ก์ปฌ ๊ฐ๋ฐ์ ๊ฒฝ์ฐ AWS CLI๋ฅผ ํตํด ๊ตฌ์ฑ๋ `~/.aws/credentials` ํ์ผ์ ์ฌ์ฉํ์ธ์.
- ์ต์ ๊ถํ์ ์์น์ ์ ์ฉํ์ธ์: ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ฉํ๋ IAM ์ฌ์ฉ์ ๋๋ ์ญํ ์ ์ํํด์ผ ํ๋ ์์ ์ ๋ํ ๊ถํ๋ง ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, S3 ๋ฒํท์์ ์ฝ๊ธฐ๋ง ํ๋ ์คํฌ๋ฆฝํธ๋ `s3:PutObject` ๋๋ `s3:DeleteObject` ๊ถํ์ ๊ฐ์ ธ์๋ ์ ๋ฉ๋๋ค.
์ฑ๋ฅ
- ํด๋ผ์ด์ธํธ/๋ฆฌ์์ค ๊ฐ์ฒด ์ฌ์ฌ์ฉ: Boto3 ํด๋ผ์ด์ธํธ ๋๋ ๋ฆฌ์์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐ๋ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ์ฅ๊ธฐ ์คํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ Lambda ํจ์์์๋ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ ์์ฑํ๊ณ ์ฌ๋ฌ ํธ์ถ์ ๊ฑธ์ณ ์ฌ์ฌ์ฉํ์ธ์.
- ๋ฆฌ์ ๋ณ ์ง์ฐ ์๊ฐ ์ดํด: ๊ฐ๋ฅํ๋ฉด ์ํธ ์์ฉํ๋ ์๋น์ค์ ๋์ผํ AWS ๋ฆฌ์ ์์ Boto3 ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ธ์. ์๋ฅผ ๋ค์ด, `eu-west-1`์ ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด `eu-west-1`์ EC2 ์ธ์คํด์ค์์ ์ฝ๋๋ฅผ ์คํํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ด ํฌ๊ฒ ์ค์ด๋ญ๋๋ค.
์ฝ๋ ํ์ง ๋ฐ ์ ์ง๋ณด์์ฑ
- Boto3 ํธ์ถ ์ถ์ํ: ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ Boto3 ํธ์ถ์ ํฉ์ด๋์ง ๋ง์ธ์. ์์ ๋ง์ ํจ์๋ ํด๋์ค(์: `S3Manager` ํด๋์ค)๋ก ๊ฐ์ธ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ๊ณ , ํ ์คํธํ๊ณ , ์ ์ง ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ก๊น ์ฌ์ฉ: `print()` ๋ฌธ ๋์ ํ์ด์ฌ์ `logging` ๋ชจ๋์ ์ฌ์ฉํ์ธ์. ์ด๋ฅผ ํตํด ์์ธ๋(verbosity)๋ฅผ ์ ์ดํ๊ณ ์ถ๋ ฅ์ ํ์ผ์ด๋ ๋ก๊น ์๋น์ค๋ก ๋ณด๋ผ ์ ์์ผ๋ฉฐ, ์ด๋ ํ๋ก๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฒ๊น ํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
๋น์ฉ ๊ด๋ฆฌ
- API ๋น์ฉ์ ์ ์ํ์ธ์: ๋ง์ API ํธ์ถ์ด ๋ฌด๋ฃ์ด์ง๋ง, ํนํ ๋๋์ `List` ๋๋ `Get` ์์ฒญ๊ณผ ๊ฐ์ ์ผ๋ถ๋ ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฌ์ฉํ๋ ์๋น์ค์ AWS ์๊ธ ๋ชจ๋ธ์ ์ธ์งํ๊ณ ์์ด์ผ ํฉ๋๋ค.
- ๋ฆฌ์์ค ์ ๋ฆฌ: ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ์ค์ ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ํญ์ ์ข ๋ฃํ๊ฑฐ๋ ์ญ์ ํ์ธ์. ์์ EC2 ๋ฐ S3 ์์ ์๋ ์ ๋ฆฌ ๋จ๊ณ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ ๋ฆฌ ์๋ํ๋ Boto3 ์์ฒด์ ํ๋ฅญํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค!
๊ฒฐ๋ก : ํด๋ผ์ฐ๋ ๋ง์คํฐ๋ฆฌ๋ฅผ ํฅํ ์ฌ์
Boto3๋ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ทธ ์ด์์ด๋ฉฐ, ์ ์ฒด AWS ์ํ๊ณ์ ๋ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์ ์ด์ ๊ด๋ฌธ์ ๋๋ค. ํด๋ผ์ด์ธํธ์ ๋ฆฌ์์ค, ์ค๋ฅ ์ฒ๋ฆฌ, ์จ์ดํฐ, ํ์ด์ง๋ค์ดํฐ์ ๊ฐ์ ํต์ฌ ๊ฐ๋ ์ ๋ง์คํฐํจ์ผ๋ก์จ ์ธํ๋ผ ์๋ํ, ๋ฐ์ดํฐ ๊ด๋ฆฌ, ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ, ๋๊ท๋ชจ ๋ณด์ ๊ฐ์ ์ ์ฉ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ฒ ๋ฉ๋๋ค.
์ฌ์ ์ ์ฌ๊ธฐ์ ๋๋์ง ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์ ๋ ผ์๋ ์์น๊ณผ ํจํด์ RDS๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ๋ถํฐ SageMaker๋ฅผ ์ฌ์ฉํ ๋จธ์ ๋ฌ๋์ ์ด๋ฅด๊ธฐ๊น์ง Boto3๊ฐ ์ง์ํ๋ ์๋ฐฑ ๊ฐ์ ๋ค๋ฅธ AWS ์๋น์ค์ ์ ์ฉํ ์ ์์ต๋๋ค. ๊ณต์ Boto3 ๋ฌธ์๋ ๊ฐ ์๋น์ค์ ํน์ ์์ ์ ํ์ํ๋ ๋ฐ ํ๋ฅญํ ๋ฆฌ์์ค์ ๋๋ค.
Boto3๋ฅผ ์ํฌํ๋ก์ฐ์ ํตํฉํจ์ผ๋ก์จ, ์ฌ๋ฌ๋ถ์ ์ฝ๋ํ ์ธํ๋ผ(Infrastructure as Code) ๊ดํ์ ์์ฉํ๊ณ ์ธ๊ณ ์ต๊ณ ์ ํด๋ผ์ฐ๋ ํ๋ซํผ์์ ๋ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ํจ์จ์ ์ธ ์๋ฃจ์ ์ ๊ตฌ์ถํ ์ ์๋ ์์ ๊ณผ ํ์ ์ญ๋์ ๊ฐํํ๊ฒ ๋ฉ๋๋ค. ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์!